#include <iostream>


/*
    栈区（Stack）：

        栈区用于存储函数的局部变量和函数调用的上下文信息。
        栈区的数据是有限的，其大小在编译时或运行时可以配置，通常较小。
        变量在栈上的内存分配和释放是自动的，随着函数的进入和退出而进行。
        栈区的生存期受限于包含它的函数的生命周期。

    堆区（Heap）：

        堆区用于动态分配内存，通常用于存储动态创建的对象、数据结构等。
        堆区的大小不固定，通常比栈区大得多。
        在堆上分配的内存需要显式释放，否则会导致内存泄漏。
        堆区的生存期由程序员控制。


    全局区（Global）或静态存储区（Static Storage）：

        全局区用于存储全局变量、静态变量和常量数据。
        这些变量在程序启动时分配，并在程序结束时释放。
        静态变量的生存期延长到程序的整个运行时间。
        全局区的数据通常存储在程序的可执行文件中，并在程序加载时初始化。
    
    常量区（Constant）：

        常量区用于存储常量数据，如字符串字面值和全局常量。
        这些数据通常存储在只读内存中，不可修改。
        常量区的数据也在程序的可执行文件中，由操作系统加载。


    代码区（Code）：

        代码区存储程序的机器指令，即可执行程序的代码。
        通常位于可执行文件中，由操作系统加载并执行。

*/

int global_a = 10;
int global_b = 100;

const int const_global_a = 10;
const int const_global_b = 100;

static int static_global_a = 10;
static int static_global_b = 100;

static const int static_const_global_a = 10;
static const int static_const_global_b = 100;

int main(int argc, char const *argv[])
{

    using namespace std;

    int local_a = 10;
    int local_b = 100;

    const int const_local_a = 10;
    const int const_local_b = 100;

    static int static_local_a = 10;
    static int static_local_b = 100;

    static const int static_const_local_a = 10;
    static const int static_const_local_b = 100;

    cout << "-------------global-------------" << endl;
    cout << "global_a -> \t" << (long)&global_a << "\t value: " << global_a << endl;
    cout << "global_b -> \t" << (long)&global_b << "\t value: " << global_b << endl;

    cout << "const_global_a -> \t" << (long)&const_global_a << "\t value: " << const_global_a << endl;
    cout << "const_global_b -> \t" << (long)&const_global_b << "\t value: " << const_global_b << endl;

    cout << "static_global_a -> \t" << (long)&static_global_a << "\t value: " << static_global_a << endl;
    cout << "static_global_b -> \t" << (long)&static_global_b << "\t value: " << static_global_b << endl;

    cout << "static_const_global_a -> \t" << (long)&static_const_global_a << "\t value: " << static_const_global_a << endl;
    cout << "static_const_global_b -> \t" << (long)&static_const_global_b << "\t value: " << static_const_global_b << endl;

    cout << "-------------local-------------" << endl;
    cout << "local_a -> \t" << (long)&local_a << "\t value: " << local_a << endl;
    cout << "local_b -> \t" << (long)&local_b << "\t value: " << local_b << endl;

    cout << "const_local_a -> \t" << (long)&const_local_a << "\t value: " << const_local_a << endl;
    cout << "const_local_b -> \t" << (long)&const_local_b << "\t value: " << const_local_b << endl;

    cout << "static_local_a -> \t" << (long)&static_local_a << "\t value: " << static_local_a << endl;
    cout << "static_local_b -> \t" << (long)&static_local_b << "\t value: " << static_local_b << endl;

    cout << "static_const_local_a -> \t" << (long)&static_const_local_a << "\t value: " << static_const_local_a << endl;
    cout << "static_const_local_b -> \t" << (long)&static_const_local_b << "\t value: " << static_const_local_b << endl;
    return 0;
}

/*
    local 和 const_local：这两者都是局部变量，它们通常存储在栈上，并且在其定义的作用域内有效。它们具有相同的生存期和作用域，但 const_local 声明为 const，意味着它的值不能被修改。

    global、static_global 和 static_local：

    global 是全局变量，存储在静态存储区域，整个程序的生命周期内有效。
    static_global 是具有静态存储期的全局变量，也存储在静态存储区域，整个程序的生命周期内有效。但与普通全局变量不同，它的作用域被限制在定义它的文件中，无法跨文件访问。
    static_local 是局部变量，但与 local 变量不同，它的生存期在函数调用结束后仍然保持，存储在静态存储区域，只会初始化一次。
    const_global、static_const_global 和 static_const_local：

    const_global 是全局常量，存储在静态存储区域，其值在整个程序的生命周期内保持不变。
    static_const_global 是具有静态存储期的全局常量，存储在静态存储区域，与 static_global 类似，它的作用域被限制在定义它的文件中，无法跨文件访问。
    static_const_local 是局部常量，与 static_local 相似，但它是常量，不可修改，且在整个程序生命周期内有效。
    
    总结：

    local 变量在函数作用域内定义和销毁。
    global、static_global 和 static_local 具有静态存储期，其生存期与程序的生命周期相关。
    const 修饰的变量是常量，无法修改其值。
    static 修饰的变量具有静态存储期，但作用域可以限制在文件内。

*/

/*
    在一起的：
        1、local  const_local
        2、global  static_global  static_local  
        3、const_global  static_const_global  static_const_local 

    总结： 
        local 一起
        global+static 一起
        const 一起

    更总结：
        local 一起
        global+static+const 一起

*/